#include<stdio.h>
#include<string.h>

//小端字节序存储：数据的低位存到低地址，高位存到高地址。
//大端字节序存储：数据的高位存到低地址，低位存到高地址。

void test1()   //判断大小端
{
	union un
	{
		int i;
		char ch;
	};

	union un u;
	u.i = 1;
	if(u.ch == 1)
		printf("this is small end\n");
	else
		printf("this is big end\n");
}

void test2()   //已知小端情况下，分析数据在内存是怎么存储的
{
	union
	{
		short k;
		char ch[2];
	}*s,a;

	s = &a;
	s->ch[0] = 0x39;
	s->ch[1] = 0x38;
	printf("0x%x\n",a.k);
}

struct bit3                  //在这里一次申请两个字节，不够再申请两个，依次类推
{                            //1. 第一次申请两个字节，a先从低位占用4个字节，b再接着a后面的第5个字节开始占用6个字节，
	unsigned short a:4;      //2. 本来c也是接着b后面占用7个字节，但是这样的话就超出了两个字节，即需要再申请两个字节
	unsigned short b:6;      //3. c就不用第一块里面剩下的6个字节，而是从第二块开始处占用7个字节
	unsigned short c:7;
};
void test3()   //位段问题
{
	struct bit3 tmp;
	memset(&tmp,'\0',sizeof(tmp));
	printf("%d\n",sizeof(tmp));

	tmp.a = 2;
	tmp.b = 3;
	tmp.c = 6;

	int *p = (int*)(&tmp);
	printf("0x%x\n",*p);
}

struct bit4
{
	unsigned short a:10;    //1. 先申请两个个字节，a从最开始占用10个字节
	unsigned int b:5;       //2. 由于还剩下6个字节，所以b从a后面接着占用5个字节 ( 有兴趣将该句改为unsigned int b:7; )
	unsigned short c:6;     //3. 然后再申请2个字节（注意,由于内存对齐问题，会闲置一个字节），然后c从新申请的字节开始处占用6个字节
};
void test4()
{
	struct bit4 tmp4;
	memset(&tmp4,'\0',sizeof(tmp4));
	printf("%d\n",sizeof(tmp4));

	tmp4.a = 2;
	tmp4.b = 3;
	tmp4.c = 6;

	int *p4 = (int*)(&tmp4);
	printf("0x%x\n",*p4);
}

int main()
{
//	test1();
//	test2();
//	test3();
	test4();
	return 0;
}
